11.1 文件操作
Dart
的IO
库包含了文件读写的相关类,是Dart的语法的一部分,在哪个平台都是由Dart IO
来完成的,而在Flutter运行的系统中,只是文件系统有一些差异。
APP目录
Android 和iOS应用存在目录不同,PathProvider
插件提供了一个平台透明的方式来访问设备文件系统的常用位置
临时目录: 可以使用
getTemporaryDirectory
来获取临时目录,系统可以随时清楚该目录(缓存).在iOS
上,这对应于NSTemporaryDirectory()
返回的值。在Android
上,这是getCacheDir()
返回的值文档目录: 可以使用
getApplicationDocumentsDirectory()
来获取应用程序的文档目录,该目录用于存储只有自己可以访问的文件。只有当应用程序被卸载时,系统才会清除该目录。在iOS
上,这对应于NSDocumentDirectory
。在Android
上,这是AppData
目录外部存储目录:可以使用
getExternalStorageDirectory()
来获取外部存储目录,如SD卡;由于iOS
不支持外部目录,所以在iOS
下调用该方法会抛出UnsupportedError
异常,而在Android
下结果是android SDK中getExternalStorageDirectory
的返回值
下边我们使用一个简单的例子来演示一下如何使用PathProvider
来创建、读取、写入文件的。
例子
- 引入PathProvider插件,在
pubspec.yaml
文件中添加声明;
path_provider: ^1.6.11
然后执行flutter pub get
,最新版本号在dart pub
获取
class BaseFileRoute extends StatefulWidget {
BaseFileRoute({Key key}) : super(key: key);
@override
_BaseFileRouteState createState() => _BaseFileRouteState();
}
class _BaseFileRouteState extends State<BaseFileRoute> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('文件读取'),
),
body: _body(),
floatingActionButton: FloatingActionButton(
child: Text('+'),
onPressed: () {
setState(() {
_count += 1;
});
},
),
);
}
int _count = 0;
String _string = '';
String _error = '';
String _writeStr = '';
Widget _body() {
return Center(
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Text(_error),
),
OutlineButton(
child: Text('创建文件文件'),
onPressed: _createFile,
),
],
),
Row(
children: <Widget>[
OutlineButton(
child: Text('读取文件'),
onPressed: _read,
),
Expanded(
child: Text(_string),
),
],
),
Row(
children: <Widget>[
OutlineButton(
child: Text('写入文件'),
onPressed: _write,
),
Expanded(
child: Text(_writeStr),
)
],
),
Row(
children: <Widget>[
OutlineButton(
child: Text('清空文件内容'),
onPressed: _clearData,
),
Text(_count.toString()),
],
)
],
),
);
}
void _read() async {
var file = new File(await _path());
var st = await file.readAsString();
setState(() {
_string = st;
});
}
void _write() async {
var file = new File(await _path());
var st = await file.readAsString();
st += ' $_count';
file.writeAsString(
st,
);
setState(() {
_writeStr = '写入成功 $_count';
});
}
void _clearData() async {
var file = new File(await _path());
var st = await file.readAsString();
st += ' $_count';
file.writeAsString(
'',
);
setState(() {
_writeStr = '文件已清空';
});
}
Future<String> _path() async {
var path = await getTemporaryDirectory();
var all = path.path + '/text.txt';
return all;
}
void _createFile() async {
try {
var path = await getTemporaryDirectory();
var all = path.path + '/text.txt';
var current = Directory(all);
if (current.existsSync() == false) {
var d = new File(all);
var f = await d.create();
if (f.existsSync()) {
print('创建成功 ${d.path}');
setState(() {
_error = '创建成功 ${d.path}';
});
} else {
setState(() {
_error = '文件创建失败';
});
}
} else {
setState(() {
_error = '文件已存在';
});
}
} catch (e) {
setState(() {
_error = '${e.toString()}';
});
print(e.toString());
}
}
}
效果如下: